{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 香农熵 \n",
    "- Shannon Entropy\n",
    "- 又稱信息熵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 香农熵代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>是否陪伴</th>\n",
       "      <th>是否玩游戏</th>\n",
       "      <th>渣男</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   是否陪伴  是否玩游戏  渣男\n",
       "0     0      1   是\n",
       "1     0      1   是\n",
       "2     0      0  不是\n",
       "3     1      1  不是\n",
       "4     1      1  不是"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "row_data = {'是否陪伴' :[0,0,0,1,1],\n",
    "            '是否玩游戏':[1,1,0,1,1],\n",
    "            '渣男' :['是','是','不是','不是','不是']}\n",
    "dataSet = pd.DataFrame(row_data) \n",
    "dataSet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9709505944546686"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def calEnt(dataSet):\n",
    "    n = dataSet.shape[0] #拿到总行数\n",
    "    iset = dataSet.iloc[:,-1].value_counts() #统计标签类别\n",
    "    p = iset/n #得到每一类标签所占比\n",
    "    ent = (-p*np.log2(p)).sum() #计算信息熵\n",
    "    return ent\n",
    "    \n",
    "#计算全体数据的信息熵---根据标签列去进行计算的\n",
    "calEnt(dataSet) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 信息增益"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>是否陪伴</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>是否玩游戏</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>渣男</th>\n",
       "      <td>是</td>\n",
       "      <td>是</td>\n",
       "      <td>不是</td>\n",
       "      <td>不是</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       0  1   2   3   4\n",
       "是否陪伴   0  0   0   1   1\n",
       "是否玩游戏  1  1   0   1   1\n",
       "渣男     是  是  不是  不是  不是"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataSet.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "计算第0列的信息增益："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4199730940219749"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = (3/5)*(-(2/3)*np.log2(2/3)-(1/3)*np.log2(1/3))\n",
    "calEnt(dataSet)-a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "计算第1列的信息增益："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.17095059445466854"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b = (4/5)*(-(2/4)*np.log2(2/4)-(2/4)*np.log2(2/4))\n",
    "calEnt(dataSet)-b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 划分数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义信息熵\n",
    "def calEnt(dataSet):\n",
    "    n = dataSet.shape[0]                              # 数据集总行数\n",
    "    iset = dataSet.iloc[:,-1].value_counts()          # 统计标签的所有类别\n",
    "    p = iset/n                                        # 统计每一类标签所占比\n",
    "    ent = (-p*np.log2(p)).sum()                       # 计算信息熵\n",
    "    return ent\n",
    "\n",
    "# 选择最优的列进行切分\n",
    "def bestSplit(dataSet):\n",
    "    baseEnt = calEnt(dataSet)                                # 计算原始熵\n",
    "    bestGain = 0                                             # 初始化信息增益\n",
    "    axis = -1                                                # 初始化最佳切分列，标签列\n",
    "    \n",
    "    for i in range(dataSet.shape[1]-1):                      # 对特征的每一列进行循环\n",
    "        levels= dataSet.iloc[:,i].value_counts().index       # 提取出当前列的所有取值\n",
    "        ents = 0                                             # 初始化子节点的信息熵\n",
    "        \n",
    "        for j in levels:                                     # 对当前列的每一个取值进行循环\n",
    "            childSet = dataSet[dataSet.iloc[:,i]==j]         # 某一个子节点的dataframe\n",
    "            ent = calEnt(childSet)                           # 计算某一个子节点的信息熵\n",
    "            ents += (childSet.shape[0]/dataSet.shape[0])*ent # 计算当前列的信息熵\n",
    "        print('第{}列的信息熵为{}'.format(i,ents))\n",
    "            \n",
    "        infoGain = baseEnt-ents                              # 计算当前列的信息增益\n",
    "        print('第{}列的信息增益为{}\\n'.format(i,infoGain))\n",
    "        \n",
    "        if (infoGain > bestGain):\n",
    "            bestGain = infoGain                              # 选择最大信息增益\n",
    "            axis = i                                         # 最大信息增益所在列的索引\n",
    "    print(\"第{}列为最优切分列\".format(axis))\n",
    "    return axis\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第0列的信息熵为0.5509775004326937\n",
      "第0列的信息增益为0.4199730940219749\n",
      "\n",
      "第1列的信息熵为0.8\n",
      "第1列的信息增益为0.17095059445466854\n",
      "\n",
      "第0列为最优切分列\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestSplit(dataSet)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 按照给定列切分数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "#为决策树进一步划分去做准备\n",
    "def mySplit(dataSet,axis,value):\n",
    "    col = dataSet.columns[axis]\n",
    "    redataSet = dataSet.loc[dataSet[col]==value,:].drop(col,axis=1)\n",
    "    return redataSet\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>是否陪伴</th>\n",
       "      <th>是否玩游戏</th>\n",
       "      <th>渣男</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   是否陪伴  是否玩游戏  渣男\n",
       "0     0      1   是\n",
       "1     0      1   是\n",
       "2     0      0  不是\n",
       "3     1      1  不是\n",
       "4     1      1  不是"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataSet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>是否玩游戏</th>\n",
       "      <th>渣男</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   是否玩游戏  渣男\n",
       "3      1  不是\n",
       "4      1  不是"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#验证函数：以axis=0，value=1为例\n",
    "mySplit(dataSet,0,1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ID3算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "函数功能：基于最大信息增益切分数据集，递归构建决策树\n",
    "参数说明：\n",
    "dataSet：原始数据集(最有一列是标签)\n",
    "return：myTree：字典形式的树\n",
    "\"\"\"\n",
    "def createTree(dataSet):\n",
    "    featlist = list(dataSet.columns)                        # 提取出数据集所有的列\n",
    "    classlist = dataSet.iloc[:,-1].value_counts()           # 获取最后一列类标签\n",
    "    \n",
    "    # 判断最多标签数目是否等于数据集行数，或者数据集是否只有一列\n",
    "    if classlist[0]==dataSet.shape[0] or dataSet.shape[1] == 1:\n",
    "        return classlist.index[0]                           # 如果是，返回类标签\n",
    "   \n",
    "    axis = bestSplit(dataSet)                               # 确定出当前最佳切分列的索引\n",
    "    bestfeat = featlist[axis]                               # 获取该索引对应的特征\n",
    "    myTree = {bestfeat:{}}                                  # 采用字典嵌套的方式存储树信息\n",
    "    del featlist[axis]                                      # 删除当前特征\n",
    "    valuelist = set(dataSet.iloc[:,axis])                   # 提取最佳切分列所有属性值\n",
    "    \n",
    "    for value in valuelist:                                 # 对每一个属性值递归建树\n",
    "        myTree[bestfeat][value] = createTree(mySplit(dataSet,axis,value))\n",
    "    \n",
    "    return myTree\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>是否陪伴</th>\n",
       "      <th>是否玩游戏</th>\n",
       "      <th>渣男</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   是否陪伴  是否玩游戏  渣男\n",
       "0     0      1   是\n",
       "1     0      1   是\n",
       "2     0      0  不是\n",
       "3     1      1  不是\n",
       "4     1      1  不是"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataSet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第0列的信息熵为0.5509775004326937\n",
      "第0列的信息增益为0.4199730940219749\n",
      "\n",
      "第1列的信息熵为0.8\n",
      "第1列的信息增益为0.17095059445466854\n",
      "\n",
      "第0列为最优切分列\n",
      "第0列的信息熵为0.0\n",
      "第0列的信息增益为0.9182958340544896\n",
      "\n",
      "第0列为最优切分列\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'是否陪伴': {0: {'是否玩游戏': {0: '不是', 1: '是'}}, 1: '不是'}}"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "createTree(dataSet)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# sklearn 实现决策树分类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入相关包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入需要的算法库和模块\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from sklearn import tree\n",
    "from sklearn.datasets import load_wine\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "plt.rcParams['font.sans-serif']=['Heiti TC']\n",
    "plt.rcParams['axes.unicode_minus']=False\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 探索数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['class_0', 'class_1', 'class_2'], dtype='<U7')"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wine = load_wine()\n",
    "\n",
    "wine.data.shape #特征X\n",
    "wine.target  #标签y\n",
    "wine.feature_names\n",
    "wine.target_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>酒精</th>\n",
       "      <th>苹果酸</th>\n",
       "      <th>灰</th>\n",
       "      <th>灰的碱性</th>\n",
       "      <th>镁</th>\n",
       "      <th>总酚</th>\n",
       "      <th>类黄酮</th>\n",
       "      <th>非黄烷类酚类</th>\n",
       "      <th>花青素</th>\n",
       "      <th>颜色强度</th>\n",
       "      <th>色调</th>\n",
       "      <th>od280/od315 稀释葡萄酒</th>\n",
       "      <th>脯氨酸</th>\n",
       "      <th>标签</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>14.23</td>\n",
       "      <td>1.71</td>\n",
       "      <td>2.43</td>\n",
       "      <td>15.6</td>\n",
       "      <td>127.0</td>\n",
       "      <td>2.80</td>\n",
       "      <td>3.06</td>\n",
       "      <td>0.28</td>\n",
       "      <td>2.29</td>\n",
       "      <td>5.64</td>\n",
       "      <td>1.04</td>\n",
       "      <td>3.92</td>\n",
       "      <td>1065.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>13.20</td>\n",
       "      <td>1.78</td>\n",
       "      <td>2.14</td>\n",
       "      <td>11.2</td>\n",
       "      <td>100.0</td>\n",
       "      <td>2.65</td>\n",
       "      <td>2.76</td>\n",
       "      <td>0.26</td>\n",
       "      <td>1.28</td>\n",
       "      <td>4.38</td>\n",
       "      <td>1.05</td>\n",
       "      <td>3.40</td>\n",
       "      <td>1050.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>13.16</td>\n",
       "      <td>2.36</td>\n",
       "      <td>2.67</td>\n",
       "      <td>18.6</td>\n",
       "      <td>101.0</td>\n",
       "      <td>2.80</td>\n",
       "      <td>3.24</td>\n",
       "      <td>0.30</td>\n",
       "      <td>2.81</td>\n",
       "      <td>5.68</td>\n",
       "      <td>1.03</td>\n",
       "      <td>3.17</td>\n",
       "      <td>1185.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14.37</td>\n",
       "      <td>1.95</td>\n",
       "      <td>2.50</td>\n",
       "      <td>16.8</td>\n",
       "      <td>113.0</td>\n",
       "      <td>3.85</td>\n",
       "      <td>3.49</td>\n",
       "      <td>0.24</td>\n",
       "      <td>2.18</td>\n",
       "      <td>7.80</td>\n",
       "      <td>0.86</td>\n",
       "      <td>3.45</td>\n",
       "      <td>1480.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>13.24</td>\n",
       "      <td>2.59</td>\n",
       "      <td>2.87</td>\n",
       "      <td>21.0</td>\n",
       "      <td>118.0</td>\n",
       "      <td>2.80</td>\n",
       "      <td>2.69</td>\n",
       "      <td>0.39</td>\n",
       "      <td>1.82</td>\n",
       "      <td>4.32</td>\n",
       "      <td>1.04</td>\n",
       "      <td>2.93</td>\n",
       "      <td>735.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>173</th>\n",
       "      <td>13.71</td>\n",
       "      <td>5.65</td>\n",
       "      <td>2.45</td>\n",
       "      <td>20.5</td>\n",
       "      <td>95.0</td>\n",
       "      <td>1.68</td>\n",
       "      <td>0.61</td>\n",
       "      <td>0.52</td>\n",
       "      <td>1.06</td>\n",
       "      <td>7.70</td>\n",
       "      <td>0.64</td>\n",
       "      <td>1.74</td>\n",
       "      <td>740.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>174</th>\n",
       "      <td>13.40</td>\n",
       "      <td>3.91</td>\n",
       "      <td>2.48</td>\n",
       "      <td>23.0</td>\n",
       "      <td>102.0</td>\n",
       "      <td>1.80</td>\n",
       "      <td>0.75</td>\n",
       "      <td>0.43</td>\n",
       "      <td>1.41</td>\n",
       "      <td>7.30</td>\n",
       "      <td>0.70</td>\n",
       "      <td>1.56</td>\n",
       "      <td>750.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>175</th>\n",
       "      <td>13.27</td>\n",
       "      <td>4.28</td>\n",
       "      <td>2.26</td>\n",
       "      <td>20.0</td>\n",
       "      <td>120.0</td>\n",
       "      <td>1.59</td>\n",
       "      <td>0.69</td>\n",
       "      <td>0.43</td>\n",
       "      <td>1.35</td>\n",
       "      <td>10.20</td>\n",
       "      <td>0.59</td>\n",
       "      <td>1.56</td>\n",
       "      <td>835.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>176</th>\n",
       "      <td>13.17</td>\n",
       "      <td>2.59</td>\n",
       "      <td>2.37</td>\n",
       "      <td>20.0</td>\n",
       "      <td>120.0</td>\n",
       "      <td>1.65</td>\n",
       "      <td>0.68</td>\n",
       "      <td>0.53</td>\n",
       "      <td>1.46</td>\n",
       "      <td>9.30</td>\n",
       "      <td>0.60</td>\n",
       "      <td>1.62</td>\n",
       "      <td>840.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>177</th>\n",
       "      <td>14.13</td>\n",
       "      <td>4.10</td>\n",
       "      <td>2.74</td>\n",
       "      <td>24.5</td>\n",
       "      <td>96.0</td>\n",
       "      <td>2.05</td>\n",
       "      <td>0.76</td>\n",
       "      <td>0.56</td>\n",
       "      <td>1.35</td>\n",
       "      <td>9.20</td>\n",
       "      <td>0.61</td>\n",
       "      <td>1.60</td>\n",
       "      <td>560.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>178 rows × 14 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        酒精   苹果酸     灰  灰的碱性      镁    总酚   类黄酮  非黄烷类酚类   花青素   颜色强度    色调  \\\n",
       "0    14.23  1.71  2.43  15.6  127.0  2.80  3.06    0.28  2.29   5.64  1.04   \n",
       "1    13.20  1.78  2.14  11.2  100.0  2.65  2.76    0.26  1.28   4.38  1.05   \n",
       "2    13.16  2.36  2.67  18.6  101.0  2.80  3.24    0.30  2.81   5.68  1.03   \n",
       "3    14.37  1.95  2.50  16.8  113.0  3.85  3.49    0.24  2.18   7.80  0.86   \n",
       "4    13.24  2.59  2.87  21.0  118.0  2.80  2.69    0.39  1.82   4.32  1.04   \n",
       "..     ...   ...   ...   ...    ...   ...   ...     ...   ...    ...   ...   \n",
       "173  13.71  5.65  2.45  20.5   95.0  1.68  0.61    0.52  1.06   7.70  0.64   \n",
       "174  13.40  3.91  2.48  23.0  102.0  1.80  0.75    0.43  1.41   7.30  0.70   \n",
       "175  13.27  4.28  2.26  20.0  120.0  1.59  0.69    0.43  1.35  10.20  0.59   \n",
       "176  13.17  2.59  2.37  20.0  120.0  1.65  0.68    0.53  1.46   9.30  0.60   \n",
       "177  14.13  4.10  2.74  24.5   96.0  2.05  0.76    0.56  1.35   9.20  0.61   \n",
       "\n",
       "     od280/od315 稀释葡萄酒     脯氨酸   标签  \n",
       "0                 3.92  1065.0  0.0  \n",
       "1                 3.40  1050.0  0.0  \n",
       "2                 3.17  1185.0  0.0  \n",
       "3                 3.45  1480.0  0.0  \n",
       "4                 2.93   735.0  0.0  \n",
       "..                 ...     ...  ...  \n",
       "173               1.74   740.0  2.0  \n",
       "174               1.56   750.0  2.0  \n",
       "175               1.56   835.0  2.0  \n",
       "176               1.62   840.0  2.0  \n",
       "177               1.60   560.0  2.0  \n",
       "\n",
       "[178 rows x 14 columns]"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#合成数据\n",
    "data =np.concatenate((wine.data,wine.target.reshape(-1,1)),axis=1)\n",
    "names = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315 稀释葡萄酒','脯氨酸','标签']\n",
    "#合成dataframe\n",
    "wine_df = pd.DataFrame(data=data,columns=names)\n",
    "wine_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 178 entries, 0 to 177\n",
      "Data columns (total 14 columns):\n",
      " #   Column             Non-Null Count  Dtype  \n",
      "---  ------             --------------  -----  \n",
      " 0   酒精                 178 non-null    float64\n",
      " 1   苹果酸                178 non-null    float64\n",
      " 2   灰                  178 non-null    float64\n",
      " 3   灰的碱性               178 non-null    float64\n",
      " 4   镁                  178 non-null    float64\n",
      " 5   总酚                 178 non-null    float64\n",
      " 6   类黄酮                178 non-null    float64\n",
      " 7   非黄烷类酚类             178 non-null    float64\n",
      " 8   花青素                178 non-null    float64\n",
      " 9   颜色强度               178 non-null    float64\n",
      " 10  色调                 178 non-null    float64\n",
      " 11  od280/od315 稀释葡萄酒  178 non-null    float64\n",
      " 12  脯氨酸                178 non-null    float64\n",
      " 13  标签                 178 non-null    float64\n",
      "dtypes: float64(14)\n",
      "memory usage: 19.6 KB\n"
     ]
    }
   ],
   "source": [
    "wine_df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 建模"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 划分训练集和测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine_df.iloc[:,:-1],\n",
    "                                             wine_df.iloc[:,-1],\n",
    "                                             test_size=0.3,\n",
    "                                             random_state=420)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(124, 13)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Xtrain.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 初步生成决策树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9444444444444444"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = DecisionTreeClassifier(criterion='entropy') #生成决策树分类器   entropy\n",
    "clf = clf.fit(Xtrain,Ytrain)\n",
    "\n",
    "clf.score(Xtest,Ytest) #得到准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.16'"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import graphviz  # pip install graphviz\n",
    "graphviz.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "feature_names = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315 稀释葡萄酒','脯氨酸']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
       " -->\n",
       "<!-- Title: Tree Pages: 1 -->\n",
       "<svg width=\"583pt\" height=\"552pt\"\n",
       " viewBox=\"0.00 0.00 582.50 552.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 548)\">\n",
       "<title>Tree</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-548 578.5,-548 578.5,4 -4,4\"/>\n",
       "<!-- 0 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>0</title>\n",
       "<polygon fill=\"#dbfae8\" stroke=\"#000000\" points=\"320,-544 193,-544 193,-461 320,-461 320,-544\"/>\n",
       "<text text-anchor=\"middle\" x=\"256.5\" y=\"-528.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">类黄酮 &lt;= 1.575</text>\n",
       "<text text-anchor=\"middle\" x=\"256.5\" y=\"-513.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 1.557</text>\n",
       "<text text-anchor=\"middle\" x=\"256.5\" y=\"-498.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 124</text>\n",
       "<text text-anchor=\"middle\" x=\"256.5\" y=\"-483.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [34, 53, 37]</text>\n",
       "<text text-anchor=\"middle\" x=\"256.5\" y=\"-468.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>1</title>\n",
       "<polygon fill=\"#a36fec\" stroke=\"#000000\" points=\"247.5,-425 127.5,-425 127.5,-342 247.5,-342 247.5,-425\"/>\n",
       "<text text-anchor=\"middle\" x=\"187.5\" y=\"-409.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">色调 &lt;= 0.92</text>\n",
       "<text text-anchor=\"middle\" x=\"187.5\" y=\"-394.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.747</text>\n",
       "<text text-anchor=\"middle\" x=\"187.5\" y=\"-379.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 47</text>\n",
       "<text text-anchor=\"middle\" x=\"187.5\" y=\"-364.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 10, 37]</text>\n",
       "<text text-anchor=\"middle\" x=\"187.5\" y=\"-349.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 贝尔摩德</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;1 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>0&#45;&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M232.3671,-460.8796C227.3539,-452.2335 222.0187,-443.0322 216.8419,-434.1042\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"219.7798,-432.1934 211.7359,-425.2981 213.7242,-435.7047 219.7798,-432.1934\"/>\n",
       "<text text-anchor=\"middle\" x=\"205.3103\" y=\"-445.7582\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">True</text>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>6</title>\n",
       "<polygon fill=\"#d6fae5\" stroke=\"#000000\" points=\"385.5,-425 265.5,-425 265.5,-342 385.5,-342 385.5,-425\"/>\n",
       "<text text-anchor=\"middle\" x=\"325.5\" y=\"-409.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">酒精 &lt;= 12.785</text>\n",
       "<text text-anchor=\"middle\" x=\"325.5\" y=\"-394.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.99</text>\n",
       "<text text-anchor=\"middle\" x=\"325.5\" y=\"-379.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 77</text>\n",
       "<text text-anchor=\"middle\" x=\"325.5\" y=\"-364.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [34, 43, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"325.5\" y=\"-349.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;6 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>0&#45;&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M280.6329,-460.8796C285.6461,-452.2335 290.9813,-443.0322 296.1581,-434.1042\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"299.2758,-435.7047 301.2641,-425.2981 293.2202,-432.1934 299.2758,-435.7047\"/>\n",
       "<text text-anchor=\"middle\" x=\"307.6897\" y=\"-445.7582\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">False</text>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>2</title>\n",
       "<polygon fill=\"#8139e5\" stroke=\"#000000\" points=\"115,-298.5 0,-298.5 0,-230.5 115,-230.5 115,-298.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"57.5\" y=\"-283.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"57.5\" y=\"-268.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 36</text>\n",
       "<text text-anchor=\"middle\" x=\"57.5\" y=\"-253.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 0, 36]</text>\n",
       "<text text-anchor=\"middle\" x=\"57.5\" y=\"-238.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 贝尔摩德</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>1&#45;&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M142.0323,-341.8796C129.1789,-330.1138 115.2021,-317.3197 102.3834,-305.5855\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"104.7264,-302.9854 94.9869,-298.8149 99.9999,-308.1488 104.7264,-302.9854\"/>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>3</title>\n",
       "<polygon fill=\"#4de88e\" stroke=\"#000000\" points=\"246,-306 133,-306 133,-223 246,-223 246,-306\"/>\n",
       "<text text-anchor=\"middle\" x=\"189.5\" y=\"-290.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">苹果酸 &lt;= 2.69</text>\n",
       "<text text-anchor=\"middle\" x=\"189.5\" y=\"-275.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.439</text>\n",
       "<text text-anchor=\"middle\" x=\"189.5\" y=\"-260.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 11</text>\n",
       "<text text-anchor=\"middle\" x=\"189.5\" y=\"-245.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 10, 1]</text>\n",
       "<text text-anchor=\"middle\" x=\"189.5\" y=\"-230.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>1&#45;&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M188.1995,-341.8796C188.3372,-333.6838 188.4834,-324.9891 188.626,-316.5013\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"192.1289,-316.3555 188.7975,-306.2981 185.1299,-316.2378 192.1289,-316.3555\"/>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>4</title>\n",
       "<polygon fill=\"#39e581\" stroke=\"#000000\" points=\"116,-179.5 3,-179.5 3,-111.5 116,-111.5 116,-179.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"59.5\" y=\"-164.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"59.5\" y=\"-149.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 10</text>\n",
       "<text text-anchor=\"middle\" x=\"59.5\" y=\"-134.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 10, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"59.5\" y=\"-119.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;4 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>3&#45;&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M144.0323,-222.8796C131.1789,-211.1138 117.2021,-198.3197 104.3834,-186.5855\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"106.7264,-183.9854 96.9869,-179.8149 101.9999,-189.1488 106.7264,-183.9854\"/>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>5</title>\n",
       "<polygon fill=\"#8139e5\" stroke=\"#000000\" points=\"249,-179.5 134,-179.5 134,-111.5 249,-111.5 249,-179.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"191.5\" y=\"-164.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"191.5\" y=\"-149.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 1</text>\n",
       "<text text-anchor=\"middle\" x=\"191.5\" y=\"-134.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 0, 1]</text>\n",
       "<text text-anchor=\"middle\" x=\"191.5\" y=\"-119.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 贝尔摩德</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;5 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>3&#45;&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M190.1995,-222.8796C190.3788,-212.2134 190.5722,-200.7021 190.7538,-189.9015\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"194.2546,-189.8724 190.9233,-179.8149 187.2556,-189.7547 194.2546,-189.8724\"/>\n",
       "</g>\n",
       "<!-- 7 -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>7</title>\n",
       "<polygon fill=\"#39e581\" stroke=\"#000000\" points=\"381,-298.5 268,-298.5 268,-230.5 381,-230.5 381,-298.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"324.5\" y=\"-283.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"324.5\" y=\"-268.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 38</text>\n",
       "<text text-anchor=\"middle\" x=\"324.5\" y=\"-253.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 38, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"324.5\" y=\"-238.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;7 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>6&#45;&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M325.1502,-341.8796C325.0606,-331.2134 324.9639,-319.7021 324.8731,-308.9015\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"328.3724,-308.7851 324.7884,-298.8149 321.3726,-308.844 328.3724,-308.7851\"/>\n",
       "</g>\n",
       "<!-- 8 -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>8</title>\n",
       "<polygon fill=\"#e99456\" stroke=\"#000000\" points=\"512,-306 399,-306 399,-223 512,-223 512,-306\"/>\n",
       "<text text-anchor=\"middle\" x=\"455.5\" y=\"-290.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">脯氨酸 &lt;= 655.0</text>\n",
       "<text text-anchor=\"middle\" x=\"455.5\" y=\"-275.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.552</text>\n",
       "<text text-anchor=\"middle\" x=\"455.5\" y=\"-260.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 39</text>\n",
       "<text text-anchor=\"middle\" x=\"455.5\" y=\"-245.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [34, 5, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"455.5\" y=\"-230.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 琴酒</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;8 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>6&#45;&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M370.9677,-341.8796C381.1017,-332.6031 391.934,-322.6874 402.3465,-313.1559\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"404.8252,-315.6319 409.8382,-306.2981 400.0987,-310.4685 404.8252,-315.6319\"/>\n",
       "</g>\n",
       "<!-- 9 -->\n",
       "<g id=\"node10\" class=\"node\">\n",
       "<title>9</title>\n",
       "<polygon fill=\"#39e581\" stroke=\"#000000\" points=\"375.5,-179.5 269.5,-179.5 269.5,-111.5 375.5,-111.5 375.5,-179.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"322.5\" y=\"-164.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"322.5\" y=\"-149.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 4</text>\n",
       "<text text-anchor=\"middle\" x=\"322.5\" y=\"-134.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 4, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"322.5\" y=\"-119.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 8&#45;&gt;9 -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>8&#45;&gt;9</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M408.9831,-222.8796C395.833,-211.1138 381.5337,-198.3197 368.4191,-186.5855\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"370.6382,-183.8746 360.852,-179.8149 365.9706,-189.0913 370.6382,-183.8746\"/>\n",
       "</g>\n",
       "<!-- 10 -->\n",
       "<g id=\"node11\" class=\"node\">\n",
       "<title>10</title>\n",
       "<polygon fill=\"#e6853f\" stroke=\"#000000\" points=\"521,-187 394,-187 394,-104 521,-104 521,-187\"/>\n",
       "<text text-anchor=\"middle\" x=\"457.5\" y=\"-171.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">灰的碱性 &lt;= 26.25</text>\n",
       "<text text-anchor=\"middle\" x=\"457.5\" y=\"-156.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.187</text>\n",
       "<text text-anchor=\"middle\" x=\"457.5\" y=\"-141.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 35</text>\n",
       "<text text-anchor=\"middle\" x=\"457.5\" y=\"-126.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [34, 1, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"457.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 琴酒</text>\n",
       "</g>\n",
       "<!-- 8&#45;&gt;10 -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>8&#45;&gt;10</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M456.1995,-222.8796C456.3372,-214.6838 456.4834,-205.9891 456.626,-197.5013\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"460.1289,-197.3555 456.7975,-187.2981 453.1299,-197.2378 460.1289,-197.3555\"/>\n",
       "</g>\n",
       "<!-- 11 -->\n",
       "<g id=\"node12\" class=\"node\">\n",
       "<title>11</title>\n",
       "<polygon fill=\"#e58139\" stroke=\"#000000\" points=\"450,-68 337,-68 337,0 450,0 450,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"393.5\" y=\"-52.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"393.5\" y=\"-37.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 34</text>\n",
       "<text text-anchor=\"middle\" x=\"393.5\" y=\"-22.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [34, 0, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"393.5\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 琴酒</text>\n",
       "</g>\n",
       "<!-- 10&#45;&gt;11 -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>10&#45;&gt;11</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M433.6688,-103.9815C428.6044,-95.1585 423.2475,-85.8258 418.1532,-76.9506\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"421.1807,-75.1942 413.167,-68.2637 415.1097,-78.6789 421.1807,-75.1942\"/>\n",
       "</g>\n",
       "<!-- 12 -->\n",
       "<g id=\"node13\" class=\"node\">\n",
       "<title>12</title>\n",
       "<polygon fill=\"#39e581\" stroke=\"#000000\" points=\"574.5,-68 468.5,-68 468.5,0 574.5,0 574.5,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"521.5\" y=\"-52.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"521.5\" y=\"-37.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 1</text>\n",
       "<text text-anchor=\"middle\" x=\"521.5\" y=\"-22.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 1, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"521.5\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 10&#45;&gt;12 -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>10&#45;&gt;12</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M481.3312,-103.9815C486.3956,-95.1585 491.7525,-85.8258 496.8468,-76.9506\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"499.8903,-78.6789 501.833,-68.2637 493.8193,-75.1942 499.8903,-78.6789\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.files.Source at 0x1a26b61950>"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dot_data = tree.export_graphviz(clf\n",
    "                     ,feature_names = feature_names #Xtrain 特征列\n",
    "                     ,class_names = [\"琴酒\",\"雪莉\",\"贝尔摩德\"] #y标签\n",
    "                     ,filled=True #渲染颜色\n",
    "                    )\n",
    "graph = graphviz.Source(dot_data,filename='决策树.pdf')\n",
    "graph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'wine.pdf'"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "graph.render('wine')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 探索决策树属性"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### clf.feature_importances_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.2833539 , 0.02504684, 0.        , 0.03394088, 0.        ,\n",
       "       0.        , 0.42318016, 0.        , 0.        , 0.        ,\n",
       "       0.15678488, 0.        , 0.07769335])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#显示每个特征的重要程度\n",
    "clf.feature_importances_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('酒精', 0.2833539000570303),\n",
       " ('苹果酸', 0.02504683873591079),\n",
       " ('灰', 0.0),\n",
       " ('灰的碱性', 0.03394088285661319),\n",
       " ('镁', 0.0),\n",
       " ('总酚', 0.0),\n",
       " ('类黄酮', 0.4231801558053247),\n",
       " ('非黄烷类酚类', 0.0),\n",
       " ('花青素', 0.0),\n",
       " ('颜色强度', 0.0),\n",
       " ('色调', 0.15678487534816657),\n",
       " ('od280/od315 稀释葡萄酒', 0.0),\n",
       " ('脯氨酸', 0.07769334719695445)]"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[*zip(feature_names,clf.feature_importances_)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### clf.apply"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 7,  5,  7,  7,  2, 11,  7,  2,  7,  7,  2, 11,  7,  7,  2,  2,  7,\n",
       "       11,  2,  7,  2, 11,  4,  4,  2,  2, 11,  7,  2,  2,  7, 11, 11, 11,\n",
       "       11,  2,  7, 11,  7, 11, 11,  2,  7, 11, 11,  9,  7, 11,  4,  7,  7,\n",
       "        2,  2,  7, 11,  4, 11,  7, 11,  7,  2,  2, 11, 11, 11, 11,  7,  7,\n",
       "       11,  2,  7,  2,  2,  7,  4,  2,  7,  4,  7,  2,  7, 11,  4,  2,  7,\n",
       "       12,  7,  2,  4,  9, 11,  2,  7, 11, 11,  4, 11, 11,  4,  7,  2,  7,\n",
       "        2,  7,  2,  9, 11, 11,  7,  2,  2, 11,  2,  2,  7,  2, 11,  2,  7,\n",
       "       11,  7,  2,  9,  2])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.apply(Xtrain)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### clf.tree_.node_count"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "13"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.tree_.node_count #返回节点个数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### clf.tree_.feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 6, 10, -2,  1, -2, -2,  0, -2, 12, -2,  3, -2, -2])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    " clf.tree_.feature  #对节点分类   -2是叶节点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 防止过拟合与剪枝"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
       " -->\n",
       "<!-- Title: Tree Pages: 1 -->\n",
       "<svg width=\"650pt\" height=\"552pt\"\n",
       " viewBox=\"0.00 0.00 650.00 552.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 548)\">\n",
       "<title>Tree</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-548 646,-548 646,4 -4,4\"/>\n",
       "<!-- 0 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>0</title>\n",
       "<polygon fill=\"#dbfae8\" stroke=\"#000000\" points=\"320,-544 193,-544 193,-461 320,-461 320,-544\"/>\n",
       "<text text-anchor=\"middle\" x=\"256.5\" y=\"-528.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">类黄酮 &lt;= 1.575</text>\n",
       "<text text-anchor=\"middle\" x=\"256.5\" y=\"-513.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 1.557</text>\n",
       "<text text-anchor=\"middle\" x=\"256.5\" y=\"-498.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 124</text>\n",
       "<text text-anchor=\"middle\" x=\"256.5\" y=\"-483.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [34, 53, 37]</text>\n",
       "<text text-anchor=\"middle\" x=\"256.5\" y=\"-468.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>1</title>\n",
       "<polygon fill=\"#a36fec\" stroke=\"#000000\" points=\"247.5,-425 127.5,-425 127.5,-342 247.5,-342 247.5,-425\"/>\n",
       "<text text-anchor=\"middle\" x=\"187.5\" y=\"-409.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">色调 &lt;= 0.92</text>\n",
       "<text text-anchor=\"middle\" x=\"187.5\" y=\"-394.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.747</text>\n",
       "<text text-anchor=\"middle\" x=\"187.5\" y=\"-379.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 47</text>\n",
       "<text text-anchor=\"middle\" x=\"187.5\" y=\"-364.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 10, 37]</text>\n",
       "<text text-anchor=\"middle\" x=\"187.5\" y=\"-349.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 贝尔摩德</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;1 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>0&#45;&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M232.3671,-460.8796C227.3539,-452.2335 222.0187,-443.0322 216.8419,-434.1042\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"219.7798,-432.1934 211.7359,-425.2981 213.7242,-435.7047 219.7798,-432.1934\"/>\n",
       "<text text-anchor=\"middle\" x=\"205.3103\" y=\"-445.7582\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">True</text>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>4</title>\n",
       "<polygon fill=\"#d6fae5\" stroke=\"#000000\" points=\"385.5,-425 265.5,-425 265.5,-342 385.5,-342 385.5,-425\"/>\n",
       "<text text-anchor=\"middle\" x=\"325.5\" y=\"-409.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">酒精 &lt;= 12.785</text>\n",
       "<text text-anchor=\"middle\" x=\"325.5\" y=\"-394.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.99</text>\n",
       "<text text-anchor=\"middle\" x=\"325.5\" y=\"-379.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 77</text>\n",
       "<text text-anchor=\"middle\" x=\"325.5\" y=\"-364.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [34, 43, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"325.5\" y=\"-349.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;4 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>0&#45;&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M280.6329,-460.8796C285.6461,-452.2335 290.9813,-443.0322 296.1581,-434.1042\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"299.2758,-435.7047 301.2641,-425.2981 293.2202,-432.1934 299.2758,-435.7047\"/>\n",
       "<text text-anchor=\"middle\" x=\"307.6897\" y=\"-445.7582\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">False</text>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>2</title>\n",
       "<polygon fill=\"#8139e5\" stroke=\"#000000\" points=\"115,-298.5 0,-298.5 0,-230.5 115,-230.5 115,-298.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"57.5\" y=\"-283.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"57.5\" y=\"-268.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 36</text>\n",
       "<text text-anchor=\"middle\" x=\"57.5\" y=\"-253.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 0, 36]</text>\n",
       "<text text-anchor=\"middle\" x=\"57.5\" y=\"-238.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 贝尔摩德</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>1&#45;&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M142.0323,-341.8796C129.1789,-330.1138 115.2021,-317.3197 102.3834,-305.5855\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"104.7264,-302.9854 94.9869,-298.8149 99.9999,-308.1488 104.7264,-302.9854\"/>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>3</title>\n",
       "<polygon fill=\"#4de88e\" stroke=\"#000000\" points=\"246,-298.5 133,-298.5 133,-230.5 246,-230.5 246,-298.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"189.5\" y=\"-283.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.439</text>\n",
       "<text text-anchor=\"middle\" x=\"189.5\" y=\"-268.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 11</text>\n",
       "<text text-anchor=\"middle\" x=\"189.5\" y=\"-253.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 10, 1]</text>\n",
       "<text text-anchor=\"middle\" x=\"189.5\" y=\"-238.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>1&#45;&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M188.1995,-341.8796C188.3788,-331.2134 188.5722,-319.7021 188.7538,-308.9015\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"192.2546,-308.8724 188.9233,-298.8149 185.2556,-308.7547 192.2546,-308.8724\"/>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>5</title>\n",
       "<polygon fill=\"#39e581\" stroke=\"#000000\" points=\"380,-298.5 267,-298.5 267,-230.5 380,-230.5 380,-298.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"323.5\" y=\"-283.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"323.5\" y=\"-268.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 38</text>\n",
       "<text text-anchor=\"middle\" x=\"323.5\" y=\"-253.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 38, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"323.5\" y=\"-238.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;5 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>4&#45;&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M324.8005,-341.8796C324.6212,-331.2134 324.4278,-319.7021 324.2462,-308.9015\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"327.7444,-308.7547 324.0767,-298.8149 320.7454,-308.8724 327.7444,-308.7547\"/>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>6</title>\n",
       "<polygon fill=\"#e99456\" stroke=\"#000000\" points=\"511,-306 398,-306 398,-223 511,-223 511,-306\"/>\n",
       "<text text-anchor=\"middle\" x=\"454.5\" y=\"-290.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">脯氨酸 &lt;= 655.0</text>\n",
       "<text text-anchor=\"middle\" x=\"454.5\" y=\"-275.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.552</text>\n",
       "<text text-anchor=\"middle\" x=\"454.5\" y=\"-260.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 39</text>\n",
       "<text text-anchor=\"middle\" x=\"454.5\" y=\"-245.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [34, 5, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"454.5\" y=\"-230.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 琴酒</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;6 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>4&#45;&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M370.6179,-341.8796C380.674,-332.6031 391.423,-322.6874 401.7554,-313.1559\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"404.2124,-315.6511 409.1895,-306.2981 399.4661,-310.506 404.2124,-315.6511\"/>\n",
       "</g>\n",
       "<!-- 7 -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>7</title>\n",
       "<polygon fill=\"#39e581\" stroke=\"#000000\" points=\"439.5,-179.5 333.5,-179.5 333.5,-111.5 439.5,-111.5 439.5,-179.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"386.5\" y=\"-164.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"386.5\" y=\"-149.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 4</text>\n",
       "<text text-anchor=\"middle\" x=\"386.5\" y=\"-134.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 4, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"386.5\" y=\"-119.3\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;7 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>6&#45;&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M430.7169,-222.8796C424.3706,-211.7735 417.5007,-199.7513 411.1109,-188.5691\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"414.1088,-186.7609 406.1085,-179.8149 408.0311,-190.2339 414.1088,-186.7609\"/>\n",
       "</g>\n",
       "<!-- 8 -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>8</title>\n",
       "<polygon fill=\"#e6853f\" stroke=\"#000000\" points=\"585,-187 458,-187 458,-104 585,-104 585,-187\"/>\n",
       "<text text-anchor=\"middle\" x=\"521.5\" y=\"-171.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">颜色强度 &lt;= 3.525</text>\n",
       "<text text-anchor=\"middle\" x=\"521.5\" y=\"-156.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.187</text>\n",
       "<text text-anchor=\"middle\" x=\"521.5\" y=\"-141.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 35</text>\n",
       "<text text-anchor=\"middle\" x=\"521.5\" y=\"-126.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [34, 1, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"521.5\" y=\"-111.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 琴酒</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;8 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>6&#45;&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M477.9333,-222.8796C482.8013,-214.2335 487.9819,-205.0322 493.0086,-196.1042\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"496.1103,-197.729 497.9666,-187.2981 490.0107,-194.2947 496.1103,-197.729\"/>\n",
       "</g>\n",
       "<!-- 9 -->\n",
       "<g id=\"node10\" class=\"node\">\n",
       "<title>9</title>\n",
       "<polygon fill=\"#39e581\" stroke=\"#000000\" points=\"510.5,-68 404.5,-68 404.5,0 510.5,0 510.5,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"457.5\" y=\"-52.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"457.5\" y=\"-37.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 1</text>\n",
       "<text text-anchor=\"middle\" x=\"457.5\" y=\"-22.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [0, 1, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"457.5\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 雪莉</text>\n",
       "</g>\n",
       "<!-- 8&#45;&gt;9 -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>8&#45;&gt;9</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M497.6688,-103.9815C492.6044,-95.1585 487.2475,-85.8258 482.1532,-76.9506\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"485.1807,-75.1942 477.167,-68.2637 479.1097,-78.6789 485.1807,-75.1942\"/>\n",
       "</g>\n",
       "<!-- 10 -->\n",
       "<g id=\"node11\" class=\"node\">\n",
       "<title>10</title>\n",
       "<polygon fill=\"#e58139\" stroke=\"#000000\" points=\"642,-68 529,-68 529,0 642,0 642,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"585.5\" y=\"-52.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">entropy = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"585.5\" y=\"-37.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">samples = 34</text>\n",
       "<text text-anchor=\"middle\" x=\"585.5\" y=\"-22.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">value = [34, 0, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"585.5\" y=\"-7.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">class = 琴酒</text>\n",
       "</g>\n",
       "<!-- 8&#45;&gt;10 -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>8&#45;&gt;10</title>\n",
       "<path fill=\"none\" stroke=\"#000000\" d=\"M545.3312,-103.9815C550.3956,-95.1585 555.7525,-85.8258 560.8468,-76.9506\"/>\n",
       "<polygon fill=\"#000000\" stroke=\"#000000\" points=\"563.8903,-78.6789 565.833,-68.2637 557.8193,-75.1942 563.8903,-78.6789\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.files.Source at 0x1a26b6c890>"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = tree.DecisionTreeClassifier(criterion='entropy'\n",
    "                                 #,max_depth=3  #最大深度\n",
    "                                 #,min_samples_leaf=5 #子节点包含样本最小个数（父节点）\n",
    "                                  ,min_samples_split=20\n",
    "                                 ) #生成决策树分类器   entropy\n",
    "\n",
    "clf = clf.fit(Xtrain,Ytrain)\n",
    "\n",
    "\n",
    "dot_data = tree.export_graphviz(clf\n",
    "                     ,feature_names = feature_names #Xtrain 特征列\n",
    "                     ,class_names = [\"琴酒\",\"雪莉\",\"贝尔摩德\"] #y标签\n",
    "                     ,filled=True #渲染颜色\n",
    "                    )\n",
    "graph = graphviz.Source(dot_data)\n",
    "graph"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 确定最优的剪枝参数（学习曲线）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test= []\n",
    "\n",
    "for i in range(10):\n",
    "    clf = tree.DecisionTreeClassifier(criterion='entropy'\n",
    "                                 ,max_depth=i+1  #最大深度\n",
    "                                 #,min_samples_leaf=5 #子节点包含样本最小个数（父节点）\n",
    "                                  #,min_samples_split=20\n",
    "                                 ,random_state=30\n",
    "                                 ,splitter='random'\n",
    "                                 ) #生成决策树分类器   entropy\n",
    "\n",
    "    clf = clf.fit(Xtrain,Ytrain)\n",
    "    score = clf.score(Xtest,Ytest)\n",
    "    test.append(score)\n",
    "\n",
    "plt.plot(range(1,11),test,color='red')\n",
    "plt.ylabel('score')\n",
    "plt.xlabel('max_depth')\n",
    "plt.xticks(range(1,11))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 样本不平衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.datasets import make_blobs #聚类产生数据集的方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x122e7e410>"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "class_1 = 1000   #类别1 样本1000个 \n",
    "class_2 = 100    #类别2 样本100个\n",
    "centers = [[0,0],[2.0,2.0]] #两个类别的中心点\n",
    "clusters_std = [2.5,0.5] #两个类别的方差 \n",
    "\n",
    "X,y = make_blobs(n_samples=[class_1,class_2],\n",
    "          centers=centers,\n",
    "          cluster_std=clusters_std,\n",
    "          random_state=420,shuffle=False)\n",
    "\n",
    "plt.scatter(X[:,0],X[:,1],c=y,cmap='rainbow',s=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeClassifier()"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#划分数据集\n",
    "Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.2,random_state=420)\n",
    "\n",
    "\n",
    "#不设定class_weight\n",
    "clf_01 = DecisionTreeClassifier()\n",
    "\n",
    "clf_01.fit(Xtrain,Ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeClassifier(class_weight='balanced')"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#设定class_weight\n",
    "clf_02 = DecisionTreeClassifier(class_weight='balanced')\n",
    "\n",
    "clf_02.fit(Xtrain,Ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8954545454545455"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf_01.score(Xtest,Ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9090909090909091"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf_02.score(Xtest,Ytest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## sk-learn 混淆矩阵库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import metrics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[183,   8],\n",
       "       [ 15,  14]])"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#平衡前\n",
    "metrics.confusion_matrix(Ytest,clf_01.predict(Xtest))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[183,   8],\n",
       "       [ 12,  17]])"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#平衡后\n",
    "metrics.confusion_matrix(Ytest,clf_02.predict(Xtest))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 精准率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6363636363636364"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.precision_score(Ytest,clf_01.predict(Xtest))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.68"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.precision_score(Ytest,clf_02.predict(Xtest))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 召回率\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4827586206896552"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.recall_score(Ytest,clf_01.predict(Xtest))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5862068965517241"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.recall_score(Ytest,clf_02.predict(Xtest))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### F值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5490196078431373"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.f1_score(Ytest,clf_01.predict(Xtest))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6296296296296295"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.f1_score(Ytest,clf_02.predict(Xtest))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "246.95px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
